// C++ Templates 中的贪婪实例化（14.4.1 章节）

// 贪婪实例化的工作原理
// 贪婪实例化是指编译器在处理每个翻译单元（translation unit）时都会生成函数模板代码，并用特殊的名称进行修饰，这样链接器就能识别重复实例化的函数模板。

// 贪婪实例化的三个主要缺点
// 1.代码冗余：编译器会生成多份相同的代码，但最终只保留一份，造成编译资源的浪费。
// 2.一致性问题：由于不同翻译单元可能使用不同的编译选项，生成的代码可能存在差异，但链接器不会进行比较，可能导致不一致的行为。
// 3.目标文件膨胀(.o文件)：这种方式会导致目标文件的体积变大，因为每个翻译单元都包含了完整的模板实例化代码。

// 例子：贪婪实例化的代码冗余现象
// 1. 头文件 myfunc.h
// myfunc.h
#ifndef MYFUNC_H
#define MYFUNC_H

template <typename T>
void myfunc(T val)
{
    // 假设这里有复杂逻辑
    std::cout << "Value: " << val << std::endl;
}

#endif

// 2. 源文件 a.cpp
// a.cpp
#include "myfunc.h"

void foo()
{
    myfunc(42); // 用int实例化
}

// 3. 源文件 b.cpp
// b.cpp
#include "myfunc.h"

void bar()
{
    myfunc(100); // 也是用int实例化
}

// 4. 主函数 main.cpp
// main.cpp
void foo();
void bar();

int main()
{
    foo();
    bar();
    return 0;
}

// 贪婪实例化的实际表现
// 当你分别编译 a.cpp 和 b.cpp 时，每个编译单元都会独立生成一份 myfunc<int> 的实例化代码，即使它们完全一样。
// 链接时，链接器会识别这些重复的实例，但只保留一份（通常通过名称修饰符）。
// 如果 a.cpp 和 b.cpp 用了不同的编译选项（比如优化级别），那么生成的 myfunc<int> 代码就可能不同，但链接器不会检查这些差异，最终保留的那一份可能不是你期望的那一份。
// 这样导致目标文件（.o 或 .obj）体积变大，编译速度变慢，但最终程序只用到一份模板实例化代码。
